/*
 * DungeonRewardResource.h
 *
 *  Created on: 2013. 9. 13.
 *      Author: mega@gamevil.com
 */

#ifndef DUNGEONREWARDRESOURCE_H_
#define DUNGEONREWARDRESOURCE_H_

#include <map>

namespace ProjectZ { namespace NResource {

class DungeonRewardData
{
public:
	struct Key
	{
		Key() : type(0), sub_type(0) {}
		Key(int rType, int rSubType) : type(rType), sub_type(rSubType) {}

		int type;
		int sub_type;

		bool operator == (const Key & rSide) const
		{
			if (this->type == rSide.type && this->sub_type == rSide.sub_type)
				return true;

			return false;
		}

		bool operator < (const Key & rSide) const
		{
			if (this->type < rSide.type)
			{
				return true;
			}
			else if (this->type == rSide.type)
			{
				if (this->sub_type < rSide.sub_type)
					return true;
			}

			return false;
		}
	};

public:
	struct Flyweight
	{
		int _TYPE;
		int _SUB_TYPE;
		int _VALUE1;
		int _VALUE2;
		int _VALUE3;
	};

public:
	typedef std::map<Key, Flyweight *> DUNGEONREWARDTREE;

public:
	DungeonRewardData() {}
	virtual ~DungeonRewardData();

	bool LoadResource(int company, int saleCode);
	Flyweight * GetFly(DungeonRewardData::Key & clsKey);

	DUNGEONREWARDTREE & GetTree() { return clsFlyTree; }

private:
	void	Clear();

private:
	DUNGEONREWARDTREE clsFlyTree;
};


class DungeonRewardResource
{
public:
	enum DungeonRewardType
	{
		EM_ZEN_CARD_PRICE		= 1,				// ZEN 카드 보상 가격
		EM_ACQUIRE_RATE	,							// 아이템 획득 확률
		EM_ACQUIRE_RATE_EVENT,						// 아이템 획득 확률_이벤트

		EM_ITEM_1_QUALITY_RATE,						// 1성 뽑기 아이템 등급 결정 확률
		EM_ITEM_1_QUALITY_RATE_EVENT,				// 1성 뽑기 아이템 등급 결정 확률_이벤트

		EM_ITEM_3_QUALITY_RATE,						// 3성 뽑기 아이템 등급 결정 확률
		EM_ITEM_3_QUALITY_RATE_EVENT,				// 3성 뽑기 아이템 등급 결정 확률_이벤트

		EM_ITEM_1_QUALITY_REFINE_RATE,				// 1성 뽑기 아이템 제련 단계 결정 확률
		EM_ITEM_1_QUALITY_REFINE_RATE_EVENT,		// 1성 뽑기 아이템 제련 단계 결정 확률_이벤트

		EM_ITEM_3_QUALITY_REFINE_RATE,				// 3성 뽑기 아이템 제련 단계 결정 확률
		EM_ITEM_3_QUALITY_REFINE_RATE_EVENT,		// 3성 뽑기 아이템 제련 단계 결정 확률_이벤트

		EM_DUNGEON_REWARD_EVENT,					// 이벤트 적용 대상 던전 여부 판단

		EM_ITEM_4_QUALITY_RATE,						// 4성 뽑기 아이템 등급 결정 확률
		EM_ITEM_4_QUALITY_REFINE_RATE,				// 4성 뽑기 아이템 제련 단계 결정 확률
	};
public:
	DungeonRewardResource();
	virtual ~DungeonRewardResource();

	bool LoadResource();
	DungeonRewardData::Flyweight * GetFly(User * pUser, DungeonRewardData::Key & clsKey);

	bool	DungeonRewardReady(User * pUser);
	bool	ItemGachyaReady(User * pUser, int gachyaType);

	int		GetItemQualityIndex(User * pUser, int gachyaType);


public:
	typedef std::vector<int> TIDVECTOR;

private:
	DungeonRewardData * GetRewardPtr(User * pUser);

	int 	GetItemTid(int minLevel, int maxLevel, int sheetType, int classType);
	int 	GetItemClassType(User * pUser, int sheetType);
	int 	GetItemQuality(User * pUser, DungeonRewardData * pReward, int rewardQuality, int gachyaType);
	int 	GetItemRefineStep(User * pUser, DungeonRewardData * pReward, int rewardQuality, int gachyaType);

	void 	SetWeapone(int minLevel, int maxLevel, int classType, TIDVECTOR & vector);
	void 	SetHelmet(int minLevel, int maxLevel, int classType, TIDVECTOR & vector);
	void 	SetArmor(int minLevel, int maxLevel, int classType, TIDVECTOR & vector);
	void 	SetGloves(int minLevel, int maxLevel, int classType, TIDVECTOR & vector);
	void 	SetShoes(int minLevel, int maxLevel, int classType, TIDVECTOR & vector);

	void 	SetNecklace(int minLevel, int maxLevel, TIDVECTOR & vector);
	void 	SetCloak(int minLevel, int maxLevel, TIDVECTOR & vector);
	void 	SetRing(int minLevel, int maxLevel, TIDVECTOR & vector);
	void 	SetCharm(int minLevel, int maxLevel, TIDVECTOR & vector);

private:
	DungeonRewardData * pDungeonRewardAD;
	DungeonRewardData * pDungeonRewardIOS;
};

} /*NResource*/ } /* namespace ProjectZ */


#endif /* DUNGEONREWARDRESOURCE_H_ */
